ホームに戻る
出典 :
関連 :
目次 :
C#における例外処理
C#ではC++同様の try - catch 節に加え、finally 節が記述できる。
例外の発生有無によらない共通の最終処理を行わせたい場合は、この finally 節に記述する。
この最終処理は try 節、または catch 節を抜ける直前に実行される。
基本形
関数 DoSomething() で発生した例外を try 節で捕捉する場合の例。
DoSomething() 内で例外が発生しなかった(正常終了した)場合は、try 節中の以降の処理が実行され、finally 節が実行される。
例外が発生した場合は try 節中の以降の処理はスキップされ、catch 節が実行された後 finally 節が実行される。
すなわち、いずれの場合においても finally 節は実行される。

try / catch 節に return を含む場合
try 節、または catch 節に return を含む場合、finally 節は return 文の直前に実行される。
このため、try / catch 節に return を含む場合、finally 節に return を記述すると、try / catch 節の return は到達できないコードとなる。
これにより例外を握りつぶす( catch 節が最後まで実行されない)可能性があるため、注意が必要。

例外の投げなおし
例外をキャッチし、再度例外をスローしたい場合は、throw 句のみを記述する。これはC++と同様である。
try
{
:
}
catch (Exception ex)
{
:
// 例外を投げなおす
throw;
}
投げなおした時点のスタックトレース情報が残るため、どこで例外を投げ(なおし)たのかが追跡できる。
下記は誤り。投げなおした時点(最新)の情報が残らない。
try
{
:
}
catch (Exception ex)
{
:
// 例外を投げなおそうとしているが…
// try 節で例外が発生した時点までの情報しか残らない
throw ex;
}
finally 節との組み合わせ
catch 節で例外を投げなおす場合は、catch 節に return を既述した場合と同様、finally 節を実行後に throw 文を実行する。
// ミューテックスの解放待ち
m_Mutex.WaitOne();
try
{
Hoge();
}
catch
{
// 例外を投げなおす
throw;
}
finally
{
// ミューテックスの解放
m_Mutex.ReleaseMutex();
}
上記の例では、例外を投げなおす直前にミューテックスを解放する。
はしがき
C#の旧い仕様では獲得した資源(ファイルストリーム、セマフォなど)の解放を finally 節で行うことが一般的であったが、
現在では using ステートメントを用いたほうが簡潔に記述できる。